<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 柯里化（Currying）是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数，并且返回接受余下的参数且返回结果的新函数的技术


    // 接受多个参数的函数
    /* function sum() {
        // var total = 0;
        // for (var i = 0; i < arguments.length; i++) {
        //     total += arguments[i];
        // }
        // return total;

        return Array.from(arguments).reduce((prev, item) => prev + item);
    }


    var result = sum(1, 4, 7, 2, 5, 8, 3, 6, 9);
    console.log(result); // 45  */


    function sum() {
        // var total = 0;
        // for (var i = 0; i < arguments.length; i++) {
        //     total += arguments[i];
        // }
        // return total;

        return Array.from(arguments).reduce((prev, item) => prev + item);
    }

    // var list = []
    // function curryingHandler() {
    //     if (arguments.length > 0) {  // 有参数就存储到数组中,并可以继续接受参数
    //         list.push(...arguments);
    //         return curryingHandler;
    //     } else { // 没有参数 => 调用函数(参数全都传输完毕)
    //         var result = sum(...list);
    //         list.length = 0;
    //         return result;
    //     }
    // }

    var list = []
    function curryingHandler() {

        if (arguments.length > 0) {  // 有参数就存储到数组中,并可以继续接受参数
            list.push(...arguments);
            return curryingHandler.bind(this); // 如果有参数 => 将this指向传递给下一个curryingHandler函数
        } else { // 没有参数 => 调用函数(参数全都传输完毕)
            var result = sum.call(this, ...list);
            list.length = 0;
            return result;
        }
    }


    // console.log(curryingHandler(1)(4)(7)());
    // console.log(curryingHandler(1)(4)(7)());

    console.log(curryingHandler(1, 4, 7)(2, 5, 8)(3, 6, 9)());

    // var result = curryingHandler(1)(4)(7)(2)(5)(8)(3)(6)(9)()
    // console.log(result);



    // var result = currySum(1)(4)(7)(2)(5)(8)(3)(6)(9)()
    // console.log(result);


</script>

</html>